package common.utils;


import common.exception.RRException;
import org.apache.commons.lang3.StringUtils;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;

/**
     * 数据脱敏工具
     */
    public class DesensitizationUtils {

        /**
         * 【中文姓名】只显示第一个汉字，其他隐藏为2个星号，比如：李**
         *
         * @param fullName
         * @return
         */
        public static String chineseName(String fullName) {
            if (StringUtils.isBlank(fullName)) {
                return "";
            }
            String name = StringUtils.left(fullName, 1);
            return StringUtils.rightPad(name, StringUtils.length(fullName), "*");
        }

        /**
         * 【身份证号】显示最后四位，其他隐藏。共计18位或者15位，比如：*************1234
         *
         * @param id
         * @return
         */
        public static String idCardNum(String id) {
            if (StringUtils.isBlank(id)) {
                return "";
            }
            String num = StringUtils.right(id, 4);
            return StringUtils.leftPad(num, StringUtils.length(id), "*");
        }

        /**
         * 【固定电话 后四位，其他隐藏，比如1234
         *
         * @param num
         * @return
         */
        public static String fixedPhone(String num) {
            if (StringUtils.isBlank(num)) {
                return "";
            }
            return StringUtils.leftPad(StringUtils.right(num, 4), StringUtils.length(num), "*");
        }

        /**
         * 【手机号码】前三位，后四位，其他隐藏，比如135******10
         *
         * @param num
         * @return
         */
        public static String mobilePhone(String num) {
            if (StringUtils.isBlank(num)) {
                return "";
            }
            return StringUtils.left(num, 3).concat(StringUtils.removeStart(StringUtils.leftPad(StringUtils.right(num, 2), StringUtils.length(num), "*"), "***"));
        }

        /**
         * 【地址】只显示到地区，不显示详细地址，比如：北京市海淀区****
         *
         * @param address
         * @param sensitiveSize 敏感信息长度
         * @return
         */
        public static String address(String address, int sensitiveSize) {
            if (StringUtils.isBlank(address)) {
                return "";
            }
            int length = StringUtils.length(address);
            return StringUtils.rightPad(StringUtils.left(address, length - sensitiveSize), length, "*");
        }

        /**
         * 【电子邮箱 邮箱前缀仅显示第一个字母，前缀其他隐藏，用星号代替，@及后面的地址显示，比如：d**@126.com>
         *
         * @param email
         * @return
         */
        public static String email(String email) {
            if (StringUtils.isBlank(email)) {
                return "";
            }
            int index = StringUtils.indexOf(email, "@");
            if (index <= 1) {
                return email;
            } else {
                return StringUtils.rightPad(StringUtils.left(email, 1), index, "*").concat(StringUtils.mid(email, index, StringUtils.length(email)));
            }
        }

        /**
         * 【银行卡号】前六位，后四位，其他用星号隐藏每位1个星号，比如：6222600**********1234>
         *
         * @param cardNum
         * @return
         */
        public static String bankCard(String cardNum) {
            if (StringUtils.isBlank(cardNum)) {
                return "";
            }
            return StringUtils.left(cardNum, 6).concat(StringUtils.removeStart(StringUtils.leftPad(StringUtils.right(cardNum, 4), StringUtils.length(cardNum), "*"), "******"));
        }

        /**
         * 【密码】密码的全部字符都用*代替，比如：******
         *
         * @param password
         * @return
         */
        public static String password(String password) {
            if (StringUtils.isBlank(password)) {
                return "";
            }
            String pwd = StringUtils.left(password, 0);
            return StringUtils.rightPad(pwd, StringUtils.length(password), "*");
        }

        /**
         * 【车牌号】前两位后一位，比如：苏M****5
         *
         * @param carNumber
         * @return
         */
        public static String carNumber(String carNumber) {
            if (StringUtils.isBlank(carNumber)) {
                return "";
            }
            return StringUtils.left(carNumber, 2).
                    concat(StringUtils.removeStart(StringUtils.leftPad(StringUtils.right(carNumber, 1), StringUtils.length(carNumber), "*"), "**"));
        }

        /**
         * 【富文本内容】 前端:encodeURI()编码  后端：URLDecoder.decode()解码
         *
         * @param richTextContent
         * @return
         */
        public static String richTextContent(String richTextContent) {
            System.out.println("richTextContent = " + richTextContent);
            if (StringUtils.isBlank(richTextContent)) {
                return "";
            }
            try {
                richTextContent = URLDecoder.decode(richTextContent, "utf-8");
                return richTextContent;
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
                throw new RRException("富文本内容转换异常");
            }
        }

        /**
         * 【UUIDS】 前端:多个逗号隔开  后端：每一个uuid都加上引号
         *
         * @param uuids
         * @return
         */
        public static String uuids(String uuids) {
            if (StringUtils.isBlank(uuids)) {
                return "";
            }
            String[] uuid = uuids.split(",");
            StringBuilder stringBuilder = new StringBuilder();
            for (String s : uuid) {
                stringBuilder.append("'").append(s).append("'").append(",");
            }
            return stringBuilder.deleteCharAt(stringBuilder.length() - 1).toString();
        }


        /**
         * 【STRINGDEFAULTVALUE】 设置字符串默认值为空
         *
         * @param string
         * @return
         */
        public static String stringDefaultValue(String string) {
            if (StringUtils.isBlank(string)) {
                return "";
            } else {
                return string;
            }
        }

        /**
         * 【SORT_TYPE】排序类型(默认1升序转asc  2降序转desc)
         *
         * @param sortType
         * @return
         */
        public static String sortType(String sortType) {
            if (StringUtils.isBlank(sortType) || "1".equals(sortType)) {
                return "asc";
            } else {
                return "desc";
            }
        }
    }